package acwing.周赛;/**
 * @author： li
 * @date： 2022-03-20 15:19
 * @version 1.0
 */
import java.io.InputStreamReader;
import java.util.*;
public class 合适数对_离散化树状数组前缀和 {
    static int N=400010;
   static int n;
   static long t,cnt=0;//t和离散化数组的长度
   static long[] s,b;//前缀和数组和离散化数组
    static int[] c;//树状数组
    //拿到排名
    static int getrank(long x){
        long l=1,r=cnt;
        while(l<r){
            long mid =(l+r)>>1;
            if(b[(int)mid]>=x) r=mid;
            else l=mid+1;
        }
        return (int)r;
    }
    //树状数组
    // k为i的二进制中从最低位到高位连续零的长度
    static int lowbit(int x){
        return x&(-x);
        //lowbit=2^k = i&(-i);
        // k为x的二进制数中从低位到高位连续零的长度
    }
    //在树状数组的第i个位置加上k
    static void update(int i,int k){
        while(i<=N){
            c[i]+=k;
            i+=lowbit(i);
        }
    }
    //求和
    static int getsum(int i){
        int res=0;
        while (i>0){
            res+=c[i];
            i-=lowbit(i);
        }
        return res;
    }
    public static void main(String[] args) {
        HashSet<Integer> hashSet = new HashSet<>();
        Scanner sc = new Scanner(new InputStreamReader(System.in));
        SortedSet<Long> tr = new TreeSet<>();
        n =sc.nextInt();t =sc.nextLong();
        s = new long[N]; b = new long[n<<1+1];
        c = new int[N];
        tr.add((long) 0); tr.add(-t); //用来计算s[0]
        for(int i=1;i<=n;i++){
            long x = sc.nextLong();
            s[i] =s[i-1]+x;//前缀和
           tr.add(s[i]);
           tr.add(s[i]-t);
        }
        cnt=tr.size();//离散化数组长度
        System.out.println("cnt="+cnt);
        int cu=1;
        for(Long i :tr)
            b[cu++] =i;
        System.out.println(Arrays.toString(b));
        long ans =0;
        update(getrank(0),1);//s[0]=0;
        //相当于动态求出现次数的前缀和
        for(int i=1;i<=n;i++){
            ans+=i-getsum(getrank(s[i]-t));//getsum(getrank(s[i]-t))是小于s[i]-t的个数 用当前数的个数减去这个就是 s[l]>s[r]-t的个数
            System.out.print(ans+" ");
            update(getrank(s[i]),1);//s[l] 出现一次 就在s[l]的位置加1
        }
        System.out.println(" ");
        System.out.println(ans);
        sc.close();
    }
}
